const dayjs = require('dayjs');
const config = require('../../../config/config');

/**
 * 调度系统配置中心
 * 统一管理所有配置参数
 */
class ScheduleConfig {
    constructor() {
        // 工作时间配置
        this.workHours = {
            start: 9,
            end: 18
        };

        // 频率限制配置（毫秒）
        this.rateLimits = {
            search: 30 * 60 * 1000,   // 搜索间隔：30分钟
            apply: 5 * 60 * 1000,      // 投递间隔：5分钟
            chat: 1 * 60 * 1000,       // 聊天间隔：1分钟
        };

        // 单日操作限制
        this.dailyLimits = {
            maxSearch: 20,     // 每天最多搜索20次
            maxApply: 50,      // 每天最多投递50份简历
            maxChat: 100,      // 每天最多发送100条聊天
        };

        // 任务超时配置（毫秒）
        this.taskTimeouts = {
            get_login_qr_code: 30 * 1000,      // 登录检查：30秒
            get_resume: 60 * 1000,       // 获取简历：1分钟
            search_jobs: 5 * 60 * 1000,  // 搜索岗位：5分钟
            chat: 30 * 1000,             // 聊天：30秒
            apply: 30 * 1000             // 投递：30秒
        };

        // 任务优先级配置
        this.taskPriorities = {
            get_login_qr_code: 10,    // 最高优先级
            get_resume: 9,
            apply: 8,
            auto_deliver: 7,           // 自动投递任务
            search_jobs: 6,
            chat: 5,
            cleanup: 1
        };

        // 监控配置
        this.monitoring = {
            heartbeatTimeout: 3 * 60 * 1000,      // 心跳超时：5分钟
            taskFailureRate: 0.5,                 // 任务失败率：50%
            consecutiveFailures: 3,               // 连续失败次数：3次
            alertCooldown: 5 * 60 * 1000,         // 告警冷却：5分钟
            offlineThreshold: 24 * 60 * 60 * 1000 // 离线设备清理：24小时
        };

        // 定时任务配置
        this.schedules = {
            dailyReset: '0 0 * * *',            // 每天凌晨重置统计
            jobFlowInterval: '0 */5 * * * *',       // 每10秒执行一次找工作流程
            monitoringInterval: '*/1 * * * *',       // 监控检查间隔：1分钟
            autoDeliver: '0 */5 * * * *',           // 自动投递任务：每5分钟执行一次
                      // 监控检查间隔：1分钟
        };

        // 测试配置覆盖
        if (config.test) {
            this.applyTestConfig(config.test);
        }
    }

    /**
     * 应用测试配置
     * @param {object} testConfig - 测试配置
     */
    applyTestConfig(testConfig) {
        if (testConfig.skipWorkStartHour) {
            this.workHours.start = 0;
            this.workHours.end = 24;
        }

        

        // 测试模式下缩短所有间隔时间
        if (testConfig.fastMode) {
            this.rateLimits.search = 10 * 1000;    // 10秒
            this.rateLimits.apply = 5 * 1000;      // 5秒
            this.rateLimits.chat = 2 * 1000;       // 2秒
        }
    }

    /**
     * 检查是否在工作时间
     * @returns {boolean}
     */
    isWorkingHours() {
        const now = dayjs();
        const hour = now.hour();
        return hour >= this.workHours.start && hour < this.workHours.end;
    }

    /**
     * 获取任务超时时间
     * @param {string} taskType - 任务类型
     * @returns {number} 超时时间（毫秒）
     */
    getTaskTimeout(taskType) {
        return this.taskTimeouts[taskType] || 30000; // 默认30秒
    }

    /**
     * 获取任务优先级
     * @param {string} taskType - 任务类型
     * @param {object} options - 选项
     * @returns {number} 优先级（1-10）
     */
    getTaskPriority(taskType, options = {}) {
        let priority = this.taskPriorities[taskType] || 5;

        if (options.urgent) {
            priority = Math.min(10, priority + 2);
        }

        return priority;
    }

    /**
     * 获取操作频率限制
     * @param {string} operation - 操作类型
     * @returns {number} 间隔时间（毫秒）
     */
    getRateLimit(operation) {
        return this.rateLimits[operation] || 0;
    }

    /**
     * 获取日限制
     * @param {string} operation - 操作类型
     * @returns {number} 日限制次数
     */
    getDailyLimit(operation) {
        return this.dailyLimits[`max${operation.charAt(0).toUpperCase() + operation.slice(1)}`] || Infinity;
    }
}

// 导出单例
const scheduleConfig = new ScheduleConfig();
module.exports = scheduleConfig;